package com.luoshizhen.lease.web.admin.controller.login;


import com.luoshizhen.lease.common.login.LoginUserHolder;
import com.luoshizhen.lease.common.result.Result;
import com.luoshizhen.lease.common.utils.JwtUtil;
import com.luoshizhen.lease.web.admin.service.LoginService;
import com.luoshizhen.lease.web.admin.vo.login.CaptchaVo;
import com.luoshizhen.lease.web.admin.vo.login.LoginVo;
import com.luoshizhen.lease.web.admin.vo.system.user.SystemUserInfoVo;
import io.jsonwebtoken.Claims;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@Tag(name = "后台管理系统登录管理")
@RestController
@RequestMapping("/admin")
public class LoginController {

    @Autowired
    private LoginService service;

    /**
     * 获取图形验证码
     *
     * 该接口用于生成并返回一个图形验证码对象，包含验证码的图片和唯一标识
     * 主要用于用户登录时的身份验证过程，以防止自动化脚本攻击
     *
     * @return 返回一个包含图形验证码信息的Result对象，其中包含验证码的图片和唯一标识
     */
    @Operation(summary = "获取图形验证码")
    @GetMapping("login/captcha")
    public Result<CaptchaVo> getCaptcha() {
        CaptchaVo captcha = service.getCaptcha();
        return Result.ok(captcha);
    }

    /**
     * 处理用户登录请求
     *
     * 该方法使用@PostMapping注解来处理POST请求，请求路径为"/login"
     * 请求体中应包含用户登录所需的信息，如用户名和密码
     * 登录成功后，返回一个包含用户身份验证令牌的Result对象
     *
     * @param loginVo 包含用户登录信息的实体类，如用户名和密码
     * @return 返回一个Result对象，其中包含登录成功后的令牌字符串
     */
    @Operation(summary = "登录")
    @PostMapping("login")
    public Result<String> login(@RequestBody LoginVo loginVo) {
        String token = service.login(loginVo);
        return Result.ok(token);
    }

    /**
     * 获取当前登录用户个人信息的方法
     *
     * 该方法通过GET请求获取当前登录用户的详细信息
     * 主要用于用户在登录状态下查看或获取自己的信息
     *
     * @return 返回一个Result对象，其中包含用户信息（SystemUserInfoVo）
     *         如果用户未登录或登录信息无效，则返回相应的错误信息
     */
    @Operation(summary = "获取登陆用户个人信息")
    @GetMapping("info")
    public Result<SystemUserInfoVo> info() {
        // 根据当前登录用户的ID获取用户信息
        SystemUserInfoVo userInfo = service.getLoginUserInfo(LoginUserHolder.getLoginUser().getUserId());
        // 返回包含用户信息的响应结果
        return Result.ok(userInfo);
    }
}